package es.wtestgen.services;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Transaction;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Restrictions;

import es.wtestgen.domain.Alumno;
import es.wtestgen.domain.Asignatura;
import es.wtestgen.domain.Profesor;
import es.wtestgen.util.HibernateUtil;

public class AsignaturaDAO {
	
	private static final Log log = LogFactory.getLog(AlumnoDAO.class);
	
	public AsignaturaDAO(){
		
	}
	
	
	public boolean eliminar(int codAsig){
		Transaction tx = null;
		Session session = HibernateUtil.currentSession();
		boolean eliminado = false;
		try{			
			tx = session.beginTransaction();
			Asignatura asignatura = (Asignatura)session.get(Asignatura.class,codAsig);
			
			Set<Alumno>alumnos = asignatura.getAlumnos();
			
			for (Iterator iterator = alumnos.iterator(); iterator.hasNext();) {
				Alumno alumno = (Alumno) iterator.next();
				session.delete(alumno);				
			}
			asignatura.getAlumnos().removeAll(alumnos);
			
			session.delete(asignatura);
			tx.commit();
			eliminado = true;
		}catch(Exception e){
			try{
				tx.rollback();
				e.printStackTrace();
			}catch(Exception e2){
				e2.printStackTrace();				
			}
		}finally{
				HibernateUtil.closeSession();
		}
		return eliminado;
	}
	
	
	public boolean guardar(Asignatura asignatura){
		Transaction tx = null;
		Session session = HibernateUtil.currentSession();
		boolean guardado = false;
		try{			
			tx = session.beginTransaction();
			session.clear();
			//session.flush();			
			
			if(asignatura.getCodAsig() != -1){
				Asignatura asig = (Asignatura)session.get(Asignatura.class, asignatura.getCodAsig());
				Set<Alumno>alumnos = asig.getAlumnos();
				asig.setCursoAsig(asignatura.getCursoAsig());
				asig.setNombreAsig(asignatura.getNombreAsig());
				asig.setProfesor(asignatura.getProfesor());
				asig.setExamenes(asignatura.getExamenes());
				asig.setPreguntas(asignatura.getPreguntas());
				
				session.update(asig);				
				tx.commit();
				
				for (Iterator iterator = alumnos.iterator(); iterator.hasNext();) {
					Alumno alumno = (Alumno) iterator.next();
					
					Session session2 = HibernateUtil.currentSession();
					Transaction tx2 = null;
					alumno = (Alumno)session2.get(Alumno.class, alumno.getCodAlum());
					try{
						tx2 = session2.beginTransaction();					
						alumno.getAsignaturas().add(asig);
						
						session2.save(alumno);
						
						tx2.commit();						
					}catch(Exception e){
						try{
							tx2.rollback();
							e.printStackTrace();
						}catch(Exception e2){
							e2.printStackTrace();							
						}
					}
				}
								
				
			}else{
				session.save(asignatura);				
				tx.commit();
			}
			
			guardado = true;
		}catch(Exception e){
			try{
				tx.rollback();
				e.printStackTrace();
			}catch(Exception e2){
				e2.printStackTrace();
				
			}
		}finally{
				HibernateUtil.closeSession();
		}
		return guardado;
	}
	
	
	public List findById(String cod){
		List lista = new ArrayList();
		Criteria criteria = null;
		int id = Integer.parseInt(cod);
		
		try{
			Session session = HibernateUtil.currentSession();
			criteria = session.createCriteria(Asignatura.class);
			criteria.add(Restrictions.eq("codAsig", id));
			lista = criteria.list();		
		}catch(HibernateException e){
			log.error("_____Error al obtener el registro de la clase Asignatura con id: " + id,e);
			throw new HibernateException(e);						
		}	
		return lista;
	}
	
	
	public List findAll(){
		List lista = new ArrayList();
		Criteria criteria = null;
		
		try{
			Session session = HibernateUtil.currentSession();
			criteria = session.createCriteria(Asignatura.class);
			lista = criteria.list();		
		}catch(HibernateException e){
			log.error("_____Error al obtener la todos los registros de la clase Asignatura",e);
			throw new HibernateException(e);						
		}	
		return lista;
	}
	
	
	public List findAsignaturasProfesor(Profesor profesor){
		List asignaturas = new ArrayList();
		Criteria criteria = null;
		
		try{
			Session session = HibernateUtil.currentSession();
			criteria = session.createCriteria(Asignatura.class);
			criteria.add(Expression.eq("profesor", profesor));
			asignaturas = criteria.list();		
		}catch(HibernateException e){
			log.error("_____Error al obtener las asignaturas del profesor: "+ profesor.getNombre() + " " + profesor.getApellidos(),e);
			throw new HibernateException(e);						
		}	
		
		return asignaturas;
		
	}
	
	public List findAsignaturasAlumno(Alumno alumno){
		List asignaturas = new ArrayList();
		List asignaturasAlumno = new ArrayList();
		Criteria criteria = null;
		boolean tiene = false;
		
		try{
			Session session = HibernateUtil.currentSession();
			criteria = session.createCriteria(Asignatura.class);
			asignaturas = criteria.list();
			asignaturasAlumno = criteria.list();
			
			for (Iterator iterator = asignaturas.iterator(); iterator.hasNext();) {
				Asignatura asignatura = (Asignatura) iterator.next();
				Set<Alumno> alumnos = (Set<Alumno>)asignatura.getAlumnos();
				for (Iterator iterator2 = alumnos.iterator(); iterator2
						.hasNext();) {
					Alumno a = (Alumno) iterator2.next();
					if(a.getCodAlum() == alumno.getCodAlum()){
						tiene = true;		
						break;
					}					
				}
				if(tiene == false){
					asignaturasAlumno.remove(asignatura);
				}else{
					tiene = false;					
				}
			}			
			
			
		}catch(HibernateException e){
			log.error("_____Error al obtener las asignaturas del alumno: "+ alumno.getNombre() + " " + alumno.getApellidos(),e);
			throw new HibernateException(e);						
		}	
		
		return asignaturasAlumno;
		
	}

}
